/**
 * (o1,o2)-> Integer.compare(o1,o2)
 * 左边：Lambda形参列表（接口中的抽象方法的形参列表）
 * 右边：Lambda体 （重写的抽象方法的方法体）
 * 本质：作为接口的实例
 *
 * !如果一个接口中，只声明了一个抽象方法，则此接口就称为函数式接口
 * !想用lambda表达式，就必须要有函数式接口
 */

import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;

public class LambdaTest01 {
    //语法格式一：无参，无返回值
    @Test
    public void test1() {
        Runnable runnable1 = new Runnable() {
            public void run() {
                System.out.println("匿名内部类");
            }
        };
        runnable1.run();
        System.out.println("---------------------------------------------------------");

        Runnable runnable2 = () -> {
            System.out.println("Lambda表达式");
        };
        runnable2.run();

    }


    @Test
    public void test2() {
        //语法格式二：需要一个参数，无返回值
        Consumer consumer = new Consumer<String>() {
            @Override
            public void accept(String o) {
                System.out.println(o);
            }
        };
        consumer.accept("需要一个参数，无返回值");

        System.out.println("------------------------------------------------");

        Consumer<String> con = (String o) -> System.out.println(o);
        con.accept("Lambda表达式");
    }


    @Test
    public void test3() {
        //语法格式三：数据类型可以省略，因为可以由编译器推断得出，称为“类型推断”;若只需要一个参数时，参数的小括号可以省略
        Consumer<String> con = (String o) -> System.out.println(o);
        con.accept("Lambda表达式1");

        Consumer<String> con2 = o -> System.out.println(o);
        con2.accept("Lambda表达式2");
    }


    @Test
    public void test4() {
        //语法格式四：需要两个或以上的参数，多条执行语句，并且可以有返回值
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println("----------------------------------------");
        Comparator<Integer> comparator1 = (o1, o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
    }


    @Test
    public void test5() {
        //当Lambda体只有一条语句时，return和大括号都有，则都可以省略
        Comparator<Integer> comparators = (o1, o2) -> {
            return o1.compareTo(o2);
        };
        System.out.println(comparators.compare(25, 33));
        System.out.println("----------------------------------------------------");
        Comparator<Integer> comparators1 = (o1, o2) -> o1.compareTo(o2);
        System.out.println(comparators1.compare(27,53));
    }

}